package domain;

import java.util.Collection;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.Valid;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.NotBlank;

@Entity
@Access(AccessType.PROPERTY)
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "cif" , "numeroDeCuenta"}))
public class ComunidadDeVecinos extends DomainEntity {

	private String cif;
	private String direccion;
	private String numeroDeCuenta;
	private double importeCuota;
	private double fondo;

	public ComunidadDeVecinos() {
		super();
	}

	@NotBlank
	@Pattern(regexp = "^[A-Z]{1}\\d{8}$")
	public String getCif() {
		return cif;
	}

	public void setCif(String cif) {
		this.cif = cif;
	}

	@NotBlank
	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}


	@Pattern(regexp = "^([0-9]{4}-[0-9]{4}-[0-9]{2}-[0-9]{10})$")
	public String getNumeroDeCuenta() {
		return numeroDeCuenta;
	}

	public void setNumeroDeCuenta(String numeroDeCuenta) {
		this.numeroDeCuenta = numeroDeCuenta;
	}

	@Digits(integer = 4, fraction = 2)
	@Min(0)
	public double getImporteCuota() {
		return importeCuota;
	}

	public void setImporteCuota(double importeCuota) {
		this.importeCuota = importeCuota;
	}

	@Digits(integer = 6, fraction = 2)
	@Min(0)
	public double getFondo() {
		return fondo;
	}

	public void setFondo(double fondo) {
		this.fondo = fondo;
	}

	// Relaciones

	private Presupuesto presupuesto;
	private Vecino presidente;
	private Collection<Pago> pagos;
	private Collection<Incidencia> incidencias;
	private Collection<MensajeComunidad> mensajesComunidad;
	private Collection<Vecino> vecinos;
	private Collection<Acta> actas;
	private Collection<Cuota> cuotas;
	private Collection<Reunion> reuniones;

	@Valid
	@NotNull
	@ManyToOne(optional = false)
	public Presupuesto getPresupuesto() {
		return presupuesto;
	}

	public void setPresupuesto(Presupuesto presupuesto) {
		this.presupuesto = presupuesto;
	}

	@Valid
	@ManyToOne
	public Vecino getPresidente() {
		return presidente;
	}

	public void setPresidente(Vecino presidente) {
		this.presidente = presidente;
	}

	@OneToMany(mappedBy = "comunidadDeVecinos")
	public Collection<Pago> getPagos() {
		return pagos;
	}

	public void setPagos(Collection<Pago> pagos) {
		this.pagos = pagos;
	}

	@OneToMany(mappedBy = "comunidadDeVecinos")
	public Collection<Incidencia> getIncidencias() {
		return incidencias;
	}

	public void setIncidencias(Collection<Incidencia> incidencias) {
		this.incidencias = incidencias;
	}

	@OneToMany(mappedBy = "comunidadDeVecinos")
	public Collection<MensajeComunidad> getMensajesComunidad() {
		return mensajesComunidad;
	}

	public void setMensajesComunidad(
			Collection<MensajeComunidad> mensajesComunidad) {
		this.mensajesComunidad = mensajesComunidad;
	}

	@ManyToMany(mappedBy = "comunidadesDeVecinos")
	public Collection<Vecino> getVecinos() {
		return vecinos;
	}

	public void setVecinos(Collection<Vecino> vecinos) {
		this.vecinos = vecinos;
	}

	@OneToMany(mappedBy = "comunidadDeVecinos")
	public Collection<Acta> getActas() {
		return actas;
	}

	public void setActas(Collection<Acta> actas) {
		this.actas = actas;
	}

	@OneToMany(mappedBy = "comunidadDeVecinos")
	public Collection<Cuota> getCuotas() {
		return cuotas;
	}

	public void setCuotas(Collection<Cuota> cuotas) {
		this.cuotas = cuotas;
	}

	@OneToMany(mappedBy = "comunidadDeVecinos")
	public Collection<Reunion> getReuniones() {
		return reuniones;
	}

	public void setReuniones(Collection<Reunion> reuniones) {
		this.reuniones = reuniones;
	}
}
